package br.com.srv.componentes.relatorio.velocidademaxima.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import br.com.srv.componentes.jdbcdao.DadosLidoJdbcDAO;
import br.com.srv.componentes.relatorio.velocidademaxima.util.VelocidadeComparator;
import br.com.srv.model.VelocidadeMaximaTO;
import br.com.srv.util.DateHelper;

public class VelocidadeMaximaServiceImpl implements VelocidadeMaximaService {

	private DadosLidoJdbcDAO dadosLidoJdbcDAO;
	
	private final int VELOCIDADE_MAXIMA_ACEITAVEL = 200;
	
	public List<VelocidadeMaximaTO> consultaVelocidadeMaxima(
			VelocidadeMaximaTO velocidadeMaximaTO) throws Exception {
		
		List<VelocidadeMaximaTO> resultado = new ArrayList<VelocidadeMaximaTO>();
		
		//passar data para formato aceito no DB.
		String dataInicial = DateHelper.parseStringDateToStringDateJdbc(
				velocidadeMaximaTO.getDataInicial());
		String dataFinal = DateHelper.parseStringDateToStringDateJdbc(
				velocidadeMaximaTO.getDataFinal());
		
		List<Map<String, String>> pontos = getDadosLidoJdbcDAO().consultaPontosByVeiculo(
				velocidadeMaximaTO.getVeiculoId(), dataInicial, dataFinal,
				velocidadeMaximaTO.getHoraInicial(), velocidadeMaximaTO.getHoraFinal());
		
		List<VelocidadeMaximaTO> velocidades = gerarListaVelocidadeMaximaTOs(pontos);

		if (!velocidades.isEmpty()) {
			Collections.sort(velocidades, new VelocidadeComparator());
			
			int count = 0;			
			while (true && count < velocidades.size()) {
				VelocidadeMaximaTO maximaTO = velocidades.get(count);
				if (new Double(maximaTO.getVelocidadeMaxima()) < VELOCIDADE_MAXIMA_ACEITAVEL) {					
					resultado.add(maximaTO);
					break;
				}
				count++;
			}			
		}
		
		return resultado;
	}

	private List<VelocidadeMaximaTO> gerarListaVelocidadeMaximaTOs(
			List<Map<String, String>> pontos) {
		List<VelocidadeMaximaTO> velocidades = new ArrayList<VelocidadeMaximaTO>();
		
		for (Map<String, String> mapa : pontos) {
			VelocidadeMaximaTO velocidade = new VelocidadeMaximaTO();
			velocidade.setVeiculoId((String)mapa.get("ID"));
			velocidade.setVeiculoDescricao((String)mapa.get("DESC"));
			velocidade.setHoraData((String)mapa.get("DATE_TIME"));
			velocidade.setVelocidadeMaxima((String)mapa.get("VEL"));
			velocidade.setPontoMaisProximo((String)mapa.get("NEAR_DESC"));
			velocidade.setDistanciaPontoMaisProximo((String)mapa.get("NEAR_DIST"));
			velocidade.setX((String)mapa.get("X"));
			velocidade.setY((String)mapa.get("Y"));
			velocidades.add(velocidade);
		}
		return velocidades;
	}

	public void setDadosLidoJdbcDAO(DadosLidoJdbcDAO dadosLidoJdbcDAO) {
		this.dadosLidoJdbcDAO = dadosLidoJdbcDAO;
	}

	public DadosLidoJdbcDAO getDadosLidoJdbcDAO() {
		return dadosLidoJdbcDAO;
	}
	
}
